package com.fabiodocarmo.calendario;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;

import com.fabiodocarmo.calendario.beans.DetalheNaoRepetivel;
import com.fabiodocarmo.calendario.beans.DetalheRepetivel;
import com.fabiodocarmo.calendario.bo.CalendarioBO;
import com.fabiodocarmo.calendario.bo.CalendarioException;

/**
 * Fachada do sistema calendário.
 * @author Fábio do Carmo - fabioducarmo@gmail.com
 * @version 13/03/2009, 15h21m, Fábio do Carmo - fabioducarmo@gmail.com
 * @since 04/03/2009, 18h02m
 */
public class Calendario {

    /**
     * Instância única da fachada AvaliaCesed.
     */
    private static Calendario instance;

    /**
     * Logger da Classe.
     */
    private Logger logger = Logger.getLogger(Calendario.class);

    private List<Session> sessoes;
    /**
     * Usuário da sessão.
     */
/*    private Usuario usuarioSessao;

    private List<MenuItem> menu;*/
    /**
     * Construtor privado do AvaliaCesed.
     */
    private Calendario() {
    }

    /**
     * Retorna a instância única do singleton Calendário (fachada).
     * @return A instância do Calendário.
     */
    public static Calendario getInstance() {
        if (instance == null) {
            synchronized(Calendario.class) {
            	Calendario inst = instance;
                if (inst == null) {
                    synchronized(Calendario.class) {
                    instance = new Calendario();
                    }
                }
            }
        }
        return instance;
    }


	public DetalheRepetivel buscarDetalheRepetivel(int diaDoMes, int mes) throws CalendarioException {
		CalendarioBO bo = createCalendarioBO();
		return bo.buscarDetalheRepetivel(diaDoMes, mes);
	}

	public DetalheNaoRepetivel buscarDetalheNaoRepetivel(int dia, int mes, int ano) throws CalendarioException {
		CalendarioBO bo = createCalendarioBO();
		return bo.buscarDetalheNaoRepetivel(dia, mes, ano);
	}

	private CalendarioBO createCalendarioBO() {
		return new CalendarioBO();
	}

	public void addSessaoHibernate(Session session) {
        if (sessoes == null) {
            sessoes = new ArrayList<Session>();
        }
        if (!sessoes.contains(session)) {
            sessoes.add(session);
        }
    }

    public void closeSessaoHibernate() {
        if (sessoes != null) {
            Iterator<Session> it = sessoes.iterator();
            while (it.hasNext()) {
                Session session = (Session) it.next();
                try {
                    session.close();
                } catch (HibernateException ignored) {
                    logger.warn("Couldn't close Session");
                }
            }
            sessoes = new ArrayList<Session>();
        }
    }

	public void alterarDetalheRepetivel(DetalheRepetivel detalheRepetivel) throws CalendarioException {
		CalendarioBO bo = createCalendarioBO();
		bo.alterarDetalheRepetivel(detalheRepetivel);
	}

	public void alterarDetalheNaoRepetivel(
			DetalheNaoRepetivel detalheNaoRepetivel) throws CalendarioException {
		CalendarioBO bo = createCalendarioBO();
		bo.alterarDetalheNaoRepetivel(detalheNaoRepetivel);
	}

}
